עשרות פונקציות לעבודה עם קבצים מובנות בתוך php.
כל מתכנת מתחיל מלשמור נתונים בקבצים. גם אנחנו נלך באותם עקבות.
עבודה עם קבצים היא שלב חשוב מאוד בלימוד יסודות ה-PHP. קבצים הם מקום שמירת נתונים בסיסי, נגיש והראשון שעולה בראש כשמדובר על לשמור נתונים לזמן ארוך. במדריך זה נלמד איך לקרוא ולכתוב מקובץ, לשמור בנתונים, נראה איך פועלות פונקציות עבודה עם קבצים ונבין מה קורה מאחורה.
קצת על משאבים
מכונית הפורשה האדומה של איציק בחריקה מחרישת אוזניים עצרה באחת מחמשת חניות המוסך. על ריצפת החניה, מתחת לפורשה, התנוססה לה הספרה ארבע.
איציק בקפיצת דאבל בורג מגניבה (כמו שכל המגניבים יודעים לעשות) יצא מהמכונית וזרק לעבר עובד המוסך: "תבדוק לי שמן ונוזל בלמים, חניתי בחניה ארבע".
"בסדר" - הספיק רק לענות עובד המוסך.
מה קיבל המוסכניק? מכונית? לא.
הוא קיבל את מספר החניה שבא הרכב נמצא. משאב.
כאשר אנחנו עובדים עם קבצים בפועל אנחנו עובדים עם משאבים שאומרים ל-php איפה נמצא הקובץ בזיכרון. אנחנו קוראים ממשאב, כותבים אל משאב והמפענח דואג לעשות את כל העבודה השחורה מאחורה בעצמו.
פתיחת קובץ
כשאנחנו עובדים עם קבצים, יש להעלות את הקובץ מהדיסק הקשיח אל הזיכרון.
פתיחת קובץ מתבצעת באמצעות הפונקציה fopen שמחזירה משאב – מקום הקובץ בזיכרון.
הפקודה הבאה בעברית נשמעת כך — פותחים את קובץ filename.txt לכתיבה.
$rHandle = fopen("filename.txt", "w+");
הפרמטר השני של הפונקציה הוא אופן הפתיחה.
פתיחה לכתיבה, לקריאה, לכתיבה וקריאה, להוספת תכנים בסוף הקובץ וכו'.
יש טבלה של מצבי פתיחה.
לא צריך להעתיק אותה לפה, אתם יכולים ללחוץ על הקישור לבד. נכון?
הכוונה הייתה שתעצרו ותלחצו על הקישור לטבלת מצבי פתיחה.
עכשיו מבחן קל. מהי w+
w+ = הקובץ נפתח לקריאה וכתיבה.
הסמן מוצב בתחילת הקובץ (כן הסמן הרגיל שאתם רואים מהבהב בזמן כתיבה).
כל תחולת הקובץ נמחקת לחלוטין. אם הקובץ לא קיים – הוא ייוצר.
פתיחת קובץ בנתיב אחר
יש מונח כזה "תיקיית עבודה פעילה" — התיקיה שבה נמצה הסקריפט ויחסית אליה תתבצע כל העבודה שלו. כשפותחים קובץ כלשהו, php יחפש אותו בתיקיה הפעילה הנוכחית. כלומר, התיקיה שבה נמצא הסקריפט.
לדוגמה עם הסקריפט שלנו הוא C:/www/localhost/script.php
אזי תיקיה העבודה הנוכחית היא C:/www/localhost
אם נכתוב fopen('file.txt','r'); — הסקריפט יחפש את הקובץ הזה בתוך התיקיה הנוכחית.
כדי לפתוח קובץ בתיקיה אחרת נכתוב גם את הנתיב שלו.
אבל קיימים שני סוגי נתיבים.
נתיב יחסי — מיקום הקובץ ביחס לתיקיה הנוכחית: test.txt
נתיב אבסולוטי — מיקום הקובץ משורש הדיסק: C:/www/localhost/test.txt
אם בתוך התיקיה הזו יש לנו את התיקיה test והקובץ נמצא בה, אזי הקוד שלנו יראה ככה:
$rHandle = fopen("./test/test.txt", "w+"); // יחסית לתיקיה הזו
$rHandle = fopen("C:/www/localhost/test/test.txt", "w+"); // נתיב אבסולוטי
$rHandle = fopen("C:/www/localhost/test/test.txt", "w+"); // נתיב אבסולוטי
במערכת הקבצים סימן הנקודה מסמן את "התיקיה הנוכחית".
כלומר במקרה הראשון הפניה היא אל הקובץ שנמצא בתיקיה test שנמצאת בתוך התיקיה הנוכחית.
עוד סימן חשוב במערכת הקבצים הוא שני נקודות המסמלות תיקיה אחת מעלה.
$rHandle = fopen("../test.txt","r");
זוהי פניה לקובץ שנמצא תיקיה אחת למעלה, כלומר בתוך C:/www/
אם ננסה להדפיס את $rHandle – (echo $rHandle)
אנחנו נראה הודעה: Resource id #4 ולא את תוכן הקובץ.
הסיבה לכך היא שהמשתנה מכיל את מספר החניה של הקובץ בזיכרון
ולא את התוכן עצמו.
קריאה מקובץ
זוכרים את המוסכניק שקיבל מזהה?
הוא עכשיו צריך לבצע פונקציה "בדוק שמן" שכוללת משהו כמו:
ללכת לחניה מספר ארבע, לפתוח את מכסה השמן, להציץ בפנים.
כדי לקרוא משהו מקובץ, אנחנו צריכים פונקציה שתלך לחניה שלו,
תציץ לתוכו ותחזיר לנו מה שהיא רואה. הפונקציה הזאת נקראת fread.
בדוקומנטציה היא רשומה ככה:
string fread ( resource $handle , int $length )
fread מקבלת שני פרמטרים.
הראשון מסוג resource שהוא המזהה של הקובץ שלנו, שנוצר על ידי fopen
השני הוא מספר — אורך הטקסט שיש לקרוא מהקובץ. למשל 20 בייטים.
היא מחזירה מחרוזת — התוכן שהצליחה לקרוא מהקובץ.
בואו ננסה ליצור קובץ test.txt בתיקית localhost (כך שיהיה באותה תיקיה עם הסקריפט), נכתוב בקובץ כמה מילים וננסה לקרוא אותם. אתם מוזמנים לנסות לעשות את זה בעצמכם לפני שאתם ממשיכים לקרוא את הקוד. נסו!
<?php
$sFilename = "./test.txt"; // משתנה עם מיקום ושם הקובץ בתיקיה הנוכחית.
$rHandle = fopen($sFilename, "r"); // פותחים את הקובץ לקריאה.
$sContents = fread($rHandle, filesize($sFilename)); // קוראים את תוכן הקובץ
echo $sContents;// מדפיסים את מה שהצלחנו לקרוא
$sFilename = "./test.txt"; // משתנה עם מיקום ושם הקובץ בתיקיה הנוכחית.
$rHandle = fopen($sFilename, "r"); // פותחים את הקובץ לקריאה.
$sContents = fread($rHandle, filesize($sFilename)); // קוראים את תוכן הקובץ
echo $sContents;// מדפיסים את מה שהצלחנו לקרוא
הפונקציה filesize מחזירה את גודל הקובץ בבייטים. אם גודל הקובץ הוא 500 בייט, הפונקציה תחזיר 500. נבקש מ-fread לקרוא 500 בייט ונקבל את תוכן הקובץ במלואו.
כתיבה לקובץ
כדי לכתוב משהו לקובץ, אנחנו צריכים פונקציה שתלך לחניה של הקובץ בזיכרון,
ותכתוב לשם מה שאנחנו רוצים. הפונקציה הזאת נקראת fwrite.
int fwrite ( resource $handle , string $string [, int $length ] )
fwrite מקבלת שני פרמטרים ועוד אחד אופציונלי שהוא לא חובה.
הראשון הוא המשאב שאליו יש לכתוב.
השני הוא המחרוזת שיש לכתוב אליו.
השלישי מגביל את אורך המחרוזת שתירשם לקובץ.
הפונקציה מחזירה את מספר הבייטים שנרשמו לקובץ או false אם הפעולה נכשלה.
<?php
$sFilename = "./test.txt";
$rHandle = fopen($sFilename, 'r');
fwrite($rHandle, 'This is a test');
$sFilename = "./test.txt";
$rHandle = fopen($sFilename, 'r');
fwrite($rHandle, 'This is a test');
קיצור קל
גם פה התארגנו על שני קיצורים — שני פונקציות מובנות שמקצרות את שני התהליכים המפורטים מעלה. file_get_contents שמחזירה את כל תוכן הקובץ
file_put_contents שמרוקנת את הקובץ ולאחר מכן כותבת לתוכו מה שנרצה.
$sContents = file_get_contents("./test.txt");
file_put_contents("./test.txt", "write me!");
file_put_contents("./test.txt", "write me!");
מתוך בדיקות יעילות עולה שהשימוש בקיצורים האלה הוא הרבה פעמים עדיף על פני פתיחת קובץ, קריאה וכתיבה למשאב וסגירתו. כשיש צורך לקרוא את כל תוכן הקובץ או למחוק את כל תוכנו ולכתוב משהו במקום - עדיף להשתמש בזוג הפונקציות הזה.
פונקציות נוספות לעבודה עם קבצים
יש עוד פונקציות רבות לעבודה עם קבצים שכל אחת מהן עושה משהו אחר.
is_file בודקת האם זהו קובץ ולא תיקיה כלשהי. מחזיר אמת או שקר.
$isItAFile = is_file("test.txt"); // isItAFile = true או false
Copy מעתיקה קובץ ממקום אחד למקום אחר.
copy("C:/www/test1.txt", "./someDirectory/test1copy.txt");
unlink מוחקת קובץ קיים מהדיסק.
unlink("test1copy.txt");
file מחזירה מערך שכל אלמנט בו הוא שורה אחת מהקובץ
$fArr = file("test1.txt");
Is_writable בודקת האם הקובץ ניתן לכתיבה.
$isFileWritable = is_writable("test.txt");
rename משנה את שם הקובץ
rename("f1.txt", "2f.txt");
פונקציות רבות נוספות לעבודה עם קבצים ב-php אפשר לראות בדוקומנטציה.
תרגיל בניית צא'ט פשוט
להלן מטלה לתרגול עבודה עם קבצים.
עליכם לבנות צא'ט הבנוי מסקריפט אחד עם מסך אחד בלבד.
המסך יציג input קלט לכתיבת הודעה בתחתית העמוד וכפתור "שלח".
בראש העמוד תופיע כותרת קבוע "צא'ט קבצים".
בעמוד עצמו יופיעו 10 ההודעות האחרונות שנכתבו בצא'ט.
בלחיצה על כפתור ה"שלח" העמוד יתרענן, ההודעה תתווסף לקובץ וגם תוצג בעמוד עצמו.
פרסמו את הפתרון או קבלו עזרה [url=/qna/]בפורום PHP[/url]
* בונוס: הגבילו אורך כל הודעה ל-50 תווים.
תגובות לכתבה:
אפשר לעשות את הצא'ט (שבשיעורי בית^^) בעזרת קובץ אחד?
צריך להשתמש בלולאה?
*תן רמז,או תסביר תאורטית..
תודה
בסה"כ אתה צריך שני קבצים. אחד זה הסקריפט, אחד זה קובץ עם הודעות המשתמשים.
הסקריפט יהיה אחראי על לכתוב ולקרוא. לולאה לא תצטרך. כל הפונקציות שתצטרך רשומות בעמוד הזה.
איך לעשות(תאורטי) כפתור שימחק את תוכן הקובץ-למחוק את ההתכתבות בצ'ט=לנקות דף?
נ
אם להישתמש רק בדברים שרשומים בעמוד הזה, אז פשוט למחוק את הקובץ וליצור מחדש.
אם לעשות נכון, אז לפלות את הדוקמנטציה של הפונקציה fopen. יודע איפה היא נמצאת?
אני יודע איך למחוק קובץ.
אבל אני לא יודע,איך לעשות כפתור(לינק)שבלחיצה עליו ימחק הקובץ
איך לעשות שיופיעו רק 10 הודעות ולא יותר?
צריך לקרוא רק 10 שורות. אם אתה קורא את הקובץ למערך עם file אז זה 10 האלמנטים האחרונים בלולאה.
אני לא יודע להשתמש בFILE().
אני משתמש בלולאת while עם !feof,
יש איזה רעיון?
תנסה ככה:
$lines = file(__FILE__);
for ($i = 1; $i <= 10; $i++) {
echo $lines[$i];
}
כן. תחפש את תו מעבר שורה "
". אחרי שתקרא את התו העשירי - תעצור.
כנראה שיהיה עדיף יותר פשוט ללמוד להשתמש ב FILE